package br.com.pucrs.tcc.bd;

import java.util.ArrayList;

import org.hibernate.SQLQuery;
import org.hibernate.Session;

import br.com.pucrs.tcc.ed.Evento;

public class EventoBD {

	private Session mSession;

	public EventoBD(Session session) {
		mSession = session;
	}

	public Evento insert(Evento evento) {
		mSession.save(evento);
		mSession.flush();

		return evento;
	}

	public void update(Evento evento) {
		mSession.update(evento);
	}

	public void delete(Evento evento) {
		mSession.delete(evento);
		mSession.flush();
	}

	public Evento retrieve(Evento evento) {
		Evento eventoRetorno = null;

		eventoRetorno = (Evento) mSession.load(Evento.class, evento.getId());

		return eventoRetorno;
	}

	public ArrayList<Evento> listaEventosPrivados(String matriculaAluno) {
		ArrayList<Evento> listaRetorno = null;

		StringBuilder sql = new StringBuilder();

		sql.append("     SELECT DISTINCT e.* ");
		sql.append("       FROM eventos e ");
		sql.append(" INNER JOIN grupos_trabalho g ");
		sql.append("         ON (e.grupos_trabalho_id = g.id) ");
		sql.append(" INNER JOIN alunos_grupos_trabalho ag ");
		sql.append("         ON (ag.grupos_trabalho_id = g.id) ");
		sql.append("      WHERE ag.alunos_matricula = ? ");
		sql.append("         OR g.professores_matricula = ? ");

		SQLQuery query = mSession.createSQLQuery(sql.toString());
		query.addEntity(Evento.class);
		query.setString(0, matriculaAluno);
		query.setString(1, matriculaAluno);

		listaRetorno = (ArrayList<Evento>) query.list();

		return listaRetorno;
	}

	public ArrayList<Evento> listaEventosPublicos() {
		ArrayList<Evento> listaRetorno = null;

		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT e.* ");
		sql.append("   FROM eventos e ");
		sql.append("  WHERE e.grupos_trabalho_id IS NULL ");
		sql.append("    AND e.tipo = 1 ");

		SQLQuery query = mSession.createSQLQuery(sql.toString());
		query.addEntity(Evento.class);

		listaRetorno = (ArrayList<Evento>) query.list();

		return listaRetorno;
	}

	public Evento obter(Integer id) {
		Evento evento = null;

		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT e.* ");
		sql.append("   FROM eventos e ");
		sql.append("  WHERE e.id = ? ");

		SQLQuery query = mSession.createSQLQuery(sql.toString());
		query.addEntity(Evento.class);
		query.setInteger(0, id);

		evento = (Evento) query.uniqueResult();

		return evento;
	}

	public ArrayList<Evento> listaEventosPrivadosParaAlerta() {
		ArrayList<Evento> listaRetorno = null;

		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT e.* ");
		sql.append("   FROM eventos e ");
		sql.append("  WHERE DATE_FORMAT(DATE_SUB(e.dth_evento, INTERVAL e.qtd_alertas DAY), '%Y-%m-%d') = DATE_FORMAT(CURDATE(), '%Y-%m-%d') ");
		sql.append("    AND e.tipo = 2 ");
		sql.append("    AND e.grupos_trabalho_id IS NOT NULL ");
		
		SQLQuery query = mSession.createSQLQuery(sql.toString());
		query.addEntity(Evento.class);

		listaRetorno = (ArrayList<Evento>) query.list();

		return listaRetorno;
	}
	
	public ArrayList<Evento> listaEventosPublicosParaAlerta() {
		ArrayList<Evento> listaRetorno = null;

		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT e.* ");
		sql.append("   FROM eventos e ");
		sql.append("  WHERE DATE_FORMAT(DATE_SUB(e.dth_evento, INTERVAL e.qtd_alertas DAY), '%Y-%m-%d') = DATE_FORMAT(CURDATE(), '%Y-%m-%d') ");
		sql.append("    AND e.tipo = 1 ");
		sql.append("    AND e.grupos_trabalho_id IS NULL ");

		SQLQuery query = mSession.createSQLQuery(sql.toString());
		query.addEntity(Evento.class);

		listaRetorno = (ArrayList<Evento>) query.list();

		return listaRetorno;
	}

}
